ngl: Small shader improvements
authorMatthias Clasen <mclasen@redhat.com>
Sat, 13 Mar 2021 23:21:45 +0000 (18:21 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 14 Mar 2021 20:49:31 +0000 (16:49 -0400)
Add a variant of gskSetOutputColor that saves a
few multiplications, and use it where possible.

gsk/ngl/resources/blend.glsl
gsk/ngl/resources/blit.glsl
gsk/ngl/resources/border.glsl
gsk/ngl/resources/conic_gradient.glsl
gsk/ngl/resources/inset_shadow.glsl
gsk/ngl/resources/linear_gradient.glsl
gsk/ngl/resources/outset_shadow.glsl
gsk/ngl/resources/preamble.fs.glsl
gsk/ngl/resources/radial_gradient.glsl
gsk/ngl/resources/repeat.glsl
gsk/ngl/resources/unblurred_outset_shadow.glsl

index 066c20179d86226492241f88e4318f83ec1972bb..609f9f29a2d28878066f04560617d870614756cf 100644 (file)
@@ -310,5 +310,5 @@ void main() {
   else
     discard;
 
-  gskSetOutputColor(result * u_alpha);
+  gskSetScaledOutputColor(result, u_alpha);
 }
index c232be2bfd922bce3a7aa0456c25d2059c56d2ff..ced047b9a985b9d7a149020a1ce1f2cadd6da8ad 100644 (file)
@@ -13,5 +13,5 @@ void main() {
 void main() {
   vec4 diffuse = GskTexture(u_source, vUv);
 
-  gskSetOutputColor(diffuse * u_alpha);
+  gskSetScaledOutputColor(diffuse, u_alpha);
 }
index 4f47ab87dc8292414dd50d29f7015e00755d8ff3..b8653bad499a8868b3f17cc1e30c2fd2ca10fb77 100644 (file)
@@ -39,5 +39,5 @@ void main() {
                       gsk_rounded_rect_coverage(gsk_decode_rect(transformed_inside_outline), frag),
                       0.0, 1.0);
 
-  gskSetOutputColor(final_color * alpha);
+  gskSetScaledOutputColor(final_color, alpha);
 }
index 758efe1e1e2652b672a32f1794fcac13ac706502..3a26cf95638998327d82a0a889447716741de5cf 100644 (file)
@@ -75,7 +75,7 @@ void main() {
       vec4 curr_color = gsk_premultiply(get_color(i));
       vec4 next_color = gsk_premultiply(get_color(i + 1));
       vec4 color = mix(curr_color, next_color, f);
-      gskSetOutputColor(color * u_alpha);
+      gskSetScaledOutputColor(color, u_alpha);
       return;
     }
   }
index 8cff1edee17315d22e160f6cb6db61080a5b46f5..f052a08580b0b5e38cfc83b52fd644a0254db8cd 100644 (file)
@@ -40,5 +40,5 @@ void main() {
                       gsk_rounded_rect_coverage(gsk_decode_rect(transformed_inside_outline), frag),
                       0.0, 1.0);
 
-  gskSetOutputColor(final_color * alpha);
+  gskSetScaledOutputColor(final_color, alpha);
 }
index d5c1d962f4719afd247a07fb677a98cae590021b..c4dfb537225236902cafce1cf1d8f8f090c35c9c 100644 (file)
@@ -97,7 +97,7 @@ void main() {
       vec4 curr_color = gsk_premultiply(get_color(i));
       vec4 next_color = gsk_premultiply(get_color(i + 1));
       vec4 color = mix(curr_color, next_color, f);
-      gskSetOutputColor(color * u_alpha);
+      gskSetScaledOutputColor(color, u_alpha);
       return;
     }
   }
index 0ab943b070491fbf771a7035e2f4d95941c96df7..44b05aa15234bc25d3ec2d47a6a48c7039a81dd1 100644 (file)
@@ -30,7 +30,5 @@ void main() {
 
   alpha *= (1.0 -  clamp(gsk_rounded_rect_coverage(gsk_decode_rect(transformed_outline), frag), 0.0, 1.0));
 
-  vec4 color = final_color * alpha;
-
-  gskSetOutputColor(color);
+  gskSetScaledOutputColor(final_color, alpha);
 }
index e715d2526d5b52aab54506649533b1225c9822bb..c1c5a954eec3a3c50bd8953623f82a1f87d86e6d 100644 (file)
@@ -123,11 +123,35 @@ void gskSetOutputColor(vec4 color) {
 #if defined(NO_CLIP)
   result = color;
 #elif defined(RECT_CLIP)
-  result = color * gsk_rect_coverage(gsk_get_bounds(u_clip_rect),
+  float coverage = gsk_rect_coverage(gsk_get_bounds(u_clip_rect),
                                      gsk_get_frag_coord());
+  result = color * coverage;
 #else
-  result = color * gsk_rounded_rect_coverage(gsk_create_rect(u_clip_rect),
+  float coverage = gsk_rounded_rect_coverage(gsk_create_rect(u_clip_rect),
                                              gsk_get_frag_coord());
+  result = color * coverage;
+#endif
+
+#if defined(GSK_GLES) || defined(GSK_LEGACY)
+  gl_FragColor = result;
+#else
+  outputColor = result;
+#endif
+}
+
+void gskSetScaledOutputColor(vec4 color, float alpha) {
+  vec4 result;
+
+#if defined(NO_CLIP)
+  result = color * alpha;
+#elif defined(RECT_CLIP)
+  float coverage = gsk_rect_coverage(gsk_get_bounds(u_clip_rect),
+                                     gsk_get_frag_coord());
+  result = color * (alpha * coverage);
+#else
+  float coverage = gsk_rounded_rect_coverage(gsk_create_rect(u_clip_rect),
+                                             gsk_get_frag_coord());
+  result = color * (alpha * coverage);
 #endif
 
 #if defined(GSK_GLES) || defined(GSK_LEGACY)
index 1a6774dff50d6fc6b3e4ff3d116243d7d882ae45..5990b39a84f0ed59c57f59e94e4a125ef986d0bd 100644 (file)
@@ -77,7 +77,7 @@ void main() {
       vec4 curr_color = gsk_premultiply(get_color(i));
       vec4 next_color = gsk_premultiply(get_color(i + 1));
       vec4 color = mix(curr_color, next_color, f);
-      gskSetOutputColor(color * u_alpha);
+      gskSetScaledOutputColor(color, u_alpha);
       return;
     }
   }
index 5d39603396513d450880aae7ea49b211f034a88e..1b811df2daa28e74b052d88f7a20c68c1dfc4afe 100644 (file)
@@ -40,5 +40,5 @@ void main() {
 
   vec4 diffuse = GskTexture(u_source, tp);
 
-  gskSetOutputColor(diffuse * u_alpha);
+  gskSetScaledOutputColor(diffuse, u_alpha);
 }
index 305cc5f1e21bf8644004c944314c4fdb38cd4687..cd44212c933f2c29721b306d903cca2d93514a8e 100644 (file)
@@ -39,6 +39,6 @@ void main() {
                       gsk_rounded_rect_coverage(gsk_decode_rect(transformed_inside_outline), frag),
                       0.0, 1.0);
 
-  gskSetOutputColor(final_color * alpha);
+  gskSetScaledOutputColor(final_color, alpha);
 }